import QueryString from 'qs'
import axios from 'axios'
import { router } from '../router'
import { Toast } from 'vant'
import { mobileResultCode, servModeCode } from '@/utils/common.js'
// import { Docking } from '@/assets/js/docking'

// 环境参数初始化
// sessionStorage.setItem('menu', JSON.stringify(window.g.menu))
// 业务接口请求后缀
const apiSuffix = '/mobileTerminal'
// 文件下载接口后缀
const fileSuffix = '/servFileDownLoad'
// 将文件下载路径放入sessionStorage， 后期优化
sessionStorage.setItem('fileServer', global.envBaseUrl[process.env.NODE_ENV] + fileSuffix)
// 默认十秒超时
axios.defaults.timeout = 10000
// 全局请求次数
axios.defaults.retry = 3
// 全局请求间隔
axios.defaults.retryDelay = 1000
// 请求头设置
axios.defaults.headers.post['Content-Type'] =
  'application/x-www-form-urlencoded;charset=UTF-8'
// 根据运行时环境，设置axios请求baseURL
axios.defaults.baseURL = global.envBaseUrl[process.env.NODE_ENV] + apiSuffix

// 请求拦截器
axios.interceptors.request.use(
  config => {
    return config
  },
  error => {
    return Promise.error(error)
  }
)

// 响应拦截器
axios.interceptors.response.use(
  // 成功响应处理
  response => {
    if (response.status === 200) {
      /* token过期处理：
         1.如果是浏览器访问，跳转至登录页重新登录获取token
         2.如果是三方对接，跳转至授权页，重新获取token
      */
      if (
        response.data.body.code ===
        mobileResultCode.INVALID_LOGIN_INFORMATION
      ) {
        // 浏览器访问
        sessionStorage.removeItem('session_key')
        if (
          sessionStorage.getItem('servMode') ===
          servModeCode.SERV_MODE_BROWSER
        ) {
          Toast({
            message: response.data.body.message,
            duration: 1500,
            forbidClick: true
          })
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          })
        } else {
          // 对接第三方
          // Docking.doDocking(sessionStorage.getItem('servMode'))
        }
        return false
      }
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 异常处理
  error => {
		debugger
    // 超时处理
    var config = error.config
    if (!config || !config.retry) return Promise.reject(error)
    // 设置用于跟踪重试次数的变量
    config.__retryCount = config.__retryCount || 0
    if (config.__retryCount >= config.retry) {
      return Promise.reject(error)
    }
    // 增加重试次数
    config.__retryCount++
    var backoff = new Promise(function (resolve) {
      setTimeout(() => {
        resolve()
      }, config.retryDelay || 1)
    })
    return backoff.then(() => {
      return axios(config)
    })
  }
)

/**
 * get方法，对应get请求
 * @param {string} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params,
        headers: {
          'token-key': sessionStorage.getItem('session_key')
            ? sessionStorage.getItem('session_key')
            : ''
        }
      })
      .then(response => {
        resolve(response.data)
      })
      .catch(error => {
        reject(error)
      })
  })
}

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, QueryString.stringify(params))
      .then(response => {
        resolve(response.data)
      })
      .catch(error => {
        reject(error)
      })
  })
}
